﻿using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace 一个使用_C__的标准_安全的密码加密最佳实践实现.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class CustomerController : ControllerBase
    {
        /// <summary>
        /// 假设这是你的数据库上下文对象
        /// </summary>
        //public CustomerController(MyDbContext myDbContext)
        //{
        //    _dbContext = myDbContext;
        //}

        public MyDbContext _dbContext { get; }


        /// <summary>
        /// 假设这是你的注册服务方法
        /// </summary>
        /// <param name="username"></param>
        /// <param name="plainTextPassword"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<User> RegisterUser(string username="admin", string plainTextPassword="admin")
        {
            // 1. 检查用户名是否已存在等业务逻辑...

            // 2. 对明文密码进行哈希
            string passwordHash = PasswordHasher.HashPassword(plainTextPassword);

            // 3. 创建用户对象，存入数据库
            var newUser = new User
            {
                Username = username,
                PasswordHash = passwordHash // 存的是哈希值，不是原始密码！
            };

           
           // _dbContext.Users.Add(newUser);
           //  await _dbContext.SaveChangesAsync();

            return newUser;
        }

        /// <summary>
        /// 假设这是你的登录服务方法
        /// </summary>
        /// <param name="username"></param>
        /// <param name="plainTextPassword"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<bool> ValidateLogin(string username = "admin", string plainTextPassword = "admin")
        {
            // 1. 根据用户名从数据库查找用户
             var user = await _dbContext.Users.FirstOrDefaultAsync(u => u.Username == username);

            if (user == null)
            {
                // 用户不存在，返回验证失败。但为了防止用户名枚举攻击，
                // 这里可以模拟一次哈希验证以消耗类似时间。
                PasswordHasher.HashPassword("dummy_password");
                return false;
            }

            // 2. 使用工具方法验证提交的密码是否与存储的哈希值匹配
            return PasswordHasher.Verify(plainTextPassword, user.PasswordHash);
        }
    }
}
